# -*- coding: utf-8 -*-
"""
字体配置文件
定义应用中使用的所有字体样式和大小
"""

import pygame
import os
from pathlib import Path

# 字体大小定义
FONT_SIZE_SMALL = 12
FONT_SIZE_NORMAL = 14
FONT_SIZE_MEDIUM = 16
FONT_SIZE_LARGE = 18
FONT_SIZE_XLARGE = 20
FONT_SIZE_TITLE = 24

# 字体文件路径（优先使用系统字体）
SYSTEM_FONTS = {
    "default": "SimHei",  # 黑体
    "sans_serif": "Microsoft YaHei",  # 微软雅黑
    "serif": "SimSun",  # 宋体
    "monospace": "Consolas"  # 等宽字体
}

# 字体样式定义
class FontStyle:
    """
    字体样式类
    """
    def __init__(self, family="default", size=FONT_SIZE_NORMAL, bold=False, italic=False):
        self.family = family
        self.size = size
        self.bold = bold
        self.italic = italic
        self._font = None
    
    def get_font(self):
        """
        获取pygame字体对象
        
        Returns:
            pygame.font.Font: 字体对象
        """
        if self._font is None:
            try:
                # 尝试使用系统字体
                font_name = SYSTEM_FONTS.get(self.family, SYSTEM_FONTS["default"])
                self._font = pygame.font.SysFont(font_name, self.size, self.bold, self.italic)
            except:
                # 如果系统字体不可用，使用默认字体
                self._font = pygame.font.Font(None, self.size)
        return self._font
    
    def render(self, text, antialias=True, color=(0, 0, 0)):
        """
        渲染文本
        
        Args:
            text (str): 要渲染的文本
            antialias (bool): 是否抗锯齿
            color (tuple): 文本颜色
            
        Returns:
            pygame.Surface: 渲染后的文本表面
        """
        return self.get_font().render(str(text), antialias, color)
    
    def get_size(self, text):
        """
        获取文本尺寸
        
        Args:
            text (str): 文本内容
            
        Returns:
            tuple: (width, height)
        """
        return self.get_font().size(str(text))

# 预定义字体样式
FONTS = {
    # 标题字体
    "title": FontStyle("sans_serif", FONT_SIZE_TITLE, bold=True),
    "subtitle": FontStyle("sans_serif", FONT_SIZE_LARGE, bold=True),
    
    # 正文字体
    "body": FontStyle("sans_serif", FONT_SIZE_NORMAL),
    "body_bold": FontStyle("sans_serif", FONT_SIZE_NORMAL, bold=True),
    "body_small": FontStyle("sans_serif", FONT_SIZE_SMALL),
    
    # 按钮字体
    "button": FontStyle("sans_serif", FONT_SIZE_NORMAL, bold=True),
    "button_small": FontStyle("sans_serif", FONT_SIZE_SMALL, bold=True),
    
    # 输入框字体
    "input": FontStyle("sans_serif", FONT_SIZE_NORMAL),
    "input_large": FontStyle("sans_serif", FONT_SIZE_MEDIUM),
    
    # 标签字体
    "label": FontStyle("sans_serif", FONT_SIZE_NORMAL),
    "label_small": FontStyle("sans_serif", FONT_SIZE_SMALL),
    
    # 日志字体（等宽）
    "log": FontStyle("monospace", FONT_SIZE_SMALL),
    "log_normal": FontStyle("monospace", FONT_SIZE_NORMAL),
    
    # 状态字体
    "status": FontStyle("sans_serif", FONT_SIZE_SMALL),
    "status_bold": FontStyle("sans_serif", FONT_SIZE_SMALL, bold=True),
    
    # 提示字体
    "hint": FontStyle("sans_serif", FONT_SIZE_SMALL, italic=True),
    "placeholder": FontStyle("sans_serif", FONT_SIZE_NORMAL, italic=True)
}

def get_font(font_name):
    """
    获取指定名称的字体
    
    Args:
        font_name (str): 字体名称
        
    Returns:
        FontStyle: 字体样式对象
    """
    return FONTS.get(font_name, FONTS["body"])

def init_fonts():
    """
    初始化字体系统
    需要在pygame.init()之后调用
    """
    pygame.font.init()
    
    # 检查系统可用字体
    available_fonts = pygame.font.get_fonts()
    
    # 更新字体映射，使用可用的字体
    for key, font_name in SYSTEM_FONTS.items():
        if font_name.lower().replace(" ", "") not in [f.lower().replace(" ", "") for f in available_fonts]:
            # 如果指定字体不可用，使用默认字体
            print(f"警告: 字体 '{font_name}' 不可用，将使用默认字体")

def get_text_size(text, font_name="body"):
    """
    获取文本在指定字体下的尺寸
    
    Args:
        text (str): 文本内容
        font_name (str): 字体名称
        
    Returns:
        tuple: (width, height)
    """
    font = get_font(font_name)
    return font.get_size(text)

def render_text(text, font_name="body", color=(0, 0, 0), antialias=True):
    """
    渲染文本
    
    Args:
        text (str): 要渲染的文本
        font_name (str): 字体名称
        color (tuple): 文本颜色
        antialias (bool): 是否抗锯齿
        
    Returns:
        pygame.Surface: 渲染后的文本表面
    """
    font = get_font(font_name)
    return font.render(text, antialias, color)